﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;

namespace QldtSdh.BLL
{
    public partial class BizGiangVien
    {
        /// <summary>
        /// Lấy danh sách
        /// </summary>
        /// <returns></returns>
        public static List<GiangVien> GetList(string maDonViGUID)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.GiangVienDbSet.Where(e => e.MaDonVi == maDonViGUID).OrderBy(e => e.Ten).ThenBy(e => e.HoDem).ToList();
            }
        }

        public static GiangVien GetByID(string maGiangVien)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                return db.GiangVienDbSet.Where(e => e.MaGiangVien == maGiangVien).FirstOrDefault();
            }
        }


        public static CODE_RESULT_RETURN Add(GiangVien obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var _gv = db.GiangVienDbSet.Where(e => e.MaGiangVien == obj.MaGiangVien).FirstOrDefault();
                if (_gv != null)
                    return CODE_RESULT_RETURN.MaTrung;
                //Không tự động sinh mã giảng viên nữa
                //GiangVien gv = null;
                //do
                //{
                //    defOrder++;
                //    obj.MaGiangVien = GenerateIDGiangVien("KH", donVi.MaDonVi, defOrder);
                //    gv = db.GiangVienDbSet.Where(e => e.MaGiangVien == obj.MaGiangVien).FirstOrDefault();
                //} while (gv != null);
                db.GiangVienDbSet.Add(obj);
                db.SaveChanges();
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<GiangVien>(nhatKy, null, obj.MaGiangVien, LOAIDOITUONG.GIẢNG_VIÊN, LOAITHAOTAC.Thêm);
                BizNhatKyHoatDong.Add<GiangVien>(nhatKy, obj);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN Update(GiangVien obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var _gv = db.GiangVienDbSet.Where(e => e.MaGiangVien == obj.MaGiangVien).FirstOrDefault();
                if (_gv == null)
                    return CODE_RESULT_RETURN.ThatBai;
                NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                BizNhatKyHoatDong.InitData<GiangVien>(nhatKy, _gv, obj.MaGiangVien, LOAIDOITUONG.GIẢNG_VIÊN, LOAITHAOTAC.Chỉnh_sửa);

                _gv.DiaChi = obj.DiaChi;
                _gv.Email = obj.Email;
                _gv.GioiTinh = obj.GioiTinh;
                _gv.HocHam = obj.HocHam;
                _gv.HocVi = obj.HocVi;
                _gv.HoDem = obj.HoDem;
                _gv.LaThinhGiang = obj.LaThinhGiang;
                _gv.MaGiangVienDaoTaoDaiHoc = obj.MaGiangVienDaoTaoDaiHoc;
                _gv.MaDonVi = obj.MaDonVi;
                _gv.MaSoThue = obj.MaSoThue;
                _gv.NgaySinh = obj.NgaySinh;
                _gv.SoDienThoai = obj.SoDienThoai;
                _gv.Ten = obj.Ten;
                db.SaveChanges();
                BizNhatKyHoatDong.Add<GiangVien>(nhatKy, _gv);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static CODE_RESULT_RETURN Delete(GiangVien obj)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var _gv = db.GiangVienDbSet.Where(e => e.MaGiangVien == obj.MaGiangVien).FirstOrDefault();
                if (_gv == null)
                    //return CODE_RESULT_RETURN.ThatBai;
                    throw new Exception("Hệ thống không còn chứa thông tin về giảng viên");

                var nPhanCongGiangDay = db.LopHocPhan_PhanCongGiangDayDbSet.Count(e => e.MaGiangVien == _gv.MaGiangVien);
                if (nPhanCongGiangDay > 0)
                    throw new Exception("Hệ thống còn chứa thông tin phân công giảng dạy của giảng viên");

                var nThoiKhoaBieu = db.LopHocPhan_ThoiKhoaBieuDbSet.Count(e => e.MaGiangVien == _gv.MaGiangVien);
                if (nThoiKhoaBieu > 0)
                    throw new Exception("Hệ thống còn chứa thông tin thời khoá biểu của giảng viên");

                var nLichBan = db.CongViecBanGiangVienDbSet.Count(e => e.MaGiangVien == _gv.MaGiangVien);
                if (nLichBan > 0)
                    throw new Exception("Hệ thống còn chứa thông tin công việc bận của giảng viên");

                db.GiangVienDbSet.Remove(_gv);
                BizNhatKyHoatDong.LogAndCommitDelete(_gv, _gv.MaGiangVien, LOAIDOITUONG.GIẢNG_VIÊN, db);

                //if ((_gv.LopHocPhan_PhanCongGiangDay != null && _gv.LopHocPhan_PhanCongGiangDay.Count > 0) ||
                //    (_gv.LopHocPhan_ThoiKhoaBieu != null && _gv.LopHocPhan_ThoiKhoaBieu.Count > 0))
                //    return CODE_RESULT_RETURN.ThatBai;
                //db.GiangVienDbSet.Remove(_gv);
                //db.SaveChanges();
                //NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                //BizNhatKyHoatDong.InitData<GiangVien>(nhatKy, _gv, obj.MaGiangVien, LOAIDOITUONG.GIẢNG_VIÊN, LOAITHAOTAC.Xóa);
                //BizNhatKyHoatDong.Add<GiangVien>(nhatKy, null);
                return CODE_RESULT_RETURN.ThanhCong;
            }
        }

        public static string GenerateIDGiangVien(string maTruong, string maKhoa, int defaultSTT = 1)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                string maGiangVien = maTruong + "." + maKhoa;
                var gv = db.GiangVienDbSet.Where(e => e.MaGiangVien.Contains(maGiangVien)).OrderByDescending(e => e.MaGiangVien).FirstOrDefault();
                if (gv == null)
                    return string.Format("{0}.{1:000}", maGiangVien, defaultSTT);
                var strs = gv.MaGiangVien.Split(new char[] { '.' });
                if (strs != null && strs.Count() == 3)
                {
                    var stt = int.Parse(strs[2]);
                    return string.Format("{0}.{1:000}", maGiangVien, stt + 1);
                }
                else
                    return string.Format("{0}.{1:000}", maGiangVien, defaultSTT);
            }
        }
    }

}
